package scala

import java.io

object Demo27Match {
  def main(args: Array[String]): Unit = {

    /**
      * java中的模式匹配可以匹配，基本数据类型，字符串，枚举
      *
      * scala中的模式匹配，可以匹配基本数据类型，字符串，枚举，匹配对象，匹配类型
      *
      * 按照顺序匹配，只会匹配成功一个
      * 如果前面没有匹配成功会走下划线
      *
      */

    /**
      * 1、匹配基本数据类型
      */

    val i = 100

    i match {
      case 1 => {
        println("i等于1")
      }
      case 100 => println("i等于100")

      //如果前面没有匹配成功匹配下划线
      case _ => println("默认")
    }

    /**
      * 2、匹配字符串
      *
      */

    val str = "java"


    str match {
      case "java" => println("java")
      case "scala" => println("scala")
      case _ => println("其它")
    }


    /**
      * 3、匹配对象
      *
      */
    case class User(id: String, name: String)

    val user: User = User("001", "张三")

    user match {
      case User("001", "张三") => println("张三")
      case User("002", "李四") => println("李四")
      case _ => println("其它")
    }


    /**
      * 4、匹配类型
      *
      */

    val j: Any = 100.1


    j match {
      //这路的i  代表的是上面的j  执行类型自动做了转换
      case i: Int => println("int类型" + i)
      case s: String => println("string类型" + s)
      case _ => println("其它类型" + j)
    }


    /**
      * 匹配成功之后可以由返回值
      *
      */

    val k = 100

    val r: Int = k % 2 match {
      //匹配成功之后返回
      case 1 => k + 1
      case 0 => k * 2
    }

    var s = 0
    if (k % 2 == 1) {
      s = k + 1
    } else {
      s = k * 2
    }
    println(r)
    println(s)


    /**
      * 模式匹配的应用
      *
      */

    val map = Map("001" -> "张三", "002" -> "李四")

    val name: String = map.getOrElse("001", "默认值")


    /**
      * Option ; 由两个取值，Some  None
      * some代表有值
      * None 代表没有值
      *
      */

    val option: Option[String] = map.get("003")

    val value: String = option match {
      //如果有值返回对应的值
      case Some(v) => v
      //如果没有值返回默认值
      case None => "默认值"
    }


    val list: List[(String, Int)] = List(("001", 23), ("002", 24), ("003", 25))


    list.map(kv => {
      val id: String = kv._1
      val age: Int = kv._2
      (id, age + 1)
    })


    /**
      * 使用case 代替lambda 表达式
      *
      * 需要将小括号替换成大括号
      */


    val list1: List[(String, Int)] = list.map {
      //匹配集合中的数据是否满足指定类型
      case (id: String, age: Int) =>
        (id, age + 1)
    }

    list1.foreach(println)


  }

}

